/*******************************************************************************
** 文件名称：page_mgr.c
** 文件作用：页面管理
** 编写作者：Tom Free 付瑞彪
** 编写时间：2021-05-30
** 文件备注：
** 更新记录：
**           2021-05-30 -> 创建文件
**                                                            <Tom Free 付瑞彪>
**
**           Copyright (c) 2018-2021 付瑞彪 All Rights Reserved
**
**       1 Tab == 4 Spaces     UTF-8     ANSI C Language(C99)
*******************************************************************************/

#include "page_mgr.h"
#include "app_inc.h"

/* 导入页面 */
PAGE_IMPORT(time_disp);
PAGE_IMPORT(time_setup);
PAGE_IMPORT(alarm_setup);

/* 当前页面ID */
static page_id_t cur_page_id;

/* 页面实例指针列表 */
static const page_t * const p_page_list[PAGE_ID_MAX] =
{
    [PAGE_TIME_DISPLAY]     = PAGE_QUOTE(time_disp),
    [PAGE_SET_TIME_HOUR]    = PAGE_QUOTE(time_setup),
    [PAGE_SET_TIME_MINUTE]  = PAGE_QUOTE(time_setup),
    [PAGE_SET_TIME_SECOND]  = PAGE_QUOTE(time_setup),
    [PAGE_SET_ALARM_HOUR]   = PAGE_QUOTE(alarm_setup),
    [PAGE_SET_ALARM_MINUTE] = PAGE_QUOTE(alarm_setup),
    [PAGE_SET_ALARM_SECOND] = PAGE_QUOTE(alarm_setup),
};

/* 初始化 */
void page_mgr_init(void)
{
    /* 默认时间显示页面 */
    cur_page_id = PAGE_TIME_DISPLAY;
    /* 执行进入函数 */
    if (p_page_list[cur_page_id] && p_page_list[cur_page_id]->into_cb)
    {
        p_page_list[cur_page_id]->into_cb(cur_page_id);
    }
}

/* 页面切换 */
void page_mgr_switch(page_id_t page_id)
{
    if (cur_page_id != page_id)
    {
        /* 执行退出函数 */
        if (p_page_list[cur_page_id] && p_page_list[cur_page_id]->exit_cb)
        {
            p_page_list[cur_page_id]->exit_cb(cur_page_id);
        }

        /* 页面切换 */
        cur_page_id = page_id;

        /* 执行进入函数 */
        if (p_page_list[cur_page_id] && p_page_list[cur_page_id]->into_cb)
        {
            p_page_list[cur_page_id]->into_cb(cur_page_id);
        }
    }
}

/* 解析事件 */
void page_mgr_parse_event(page_event_t evt)
{
    if (p_page_list[cur_page_id] && p_page_list[cur_page_id]->exec_cb)
    {
        p_page_list[cur_page_id]->exec_cb(cur_page_id, evt);
    }
}

/* 页面轮询 */
void page_mgr_poll(void)
{
    /* 执行轮询函数 */
    if (p_page_list[cur_page_id] && p_page_list[cur_page_id]->poll_cb)
    {
        p_page_list[cur_page_id]->poll_cb(cur_page_id);
    }
}
